package com.briup.day19;

public class Test_Runnable {
    public static void main(String[] args) {
        //实例化实现对象引用
        Runnable r=new MyRunnable();
        //1.public Thread(Runnable target) {//把他传到thread的构造方法中，底层逻辑如下
        //init(null, target, "Thread-" + nextThreadNum(), 0);
        //}传的是这个吧
//        2.
//        Init中的详细方法:
//        private void init(ThreadGroup g, Runnable target, String name, long stackSize) {
//    // 把传入的target(r)保存到this.target字段
//    this.target = target;  // 关键！把你的r保存起来了
//    this.name = name;      // 设置线程名，如"Thread-0"
//    // ... 其他初始化代码
//}
//        3.调用Thread里的start里的run方法，会执行target里的run方法;
//public void start() {
//    // 启动新线程...
//    // 新线程会执行run()方法
//}
//
// Thread类的run()方法：
//public void run() {
//    if (target != null) {
//        target.run();  // 这里调用你传入的r的run()方法！
//    }
//}
        //但果如实例化了多个线程，不知道是哪个得current判断一下

        //创建Thread线程对象
        Thread th=new Thread(r);
        th.start();
//        th.getName();
        Runnable r2=new MyRunnable() {//并不是实现了接口，而是多态，有接口指向匿名内部类
          public void run() {
              String name = Thread.currentThread().getName();
              for (int i = 80; i >= 30; i--) {
                  System.out.println(name+" "+i);
              }
          }
        };
        Thread th2=new Thread(r2,"子线程2");
        th2.start();
    }
}
/*
* 创建线程的第二种方式
* 1.创建runnable实现类实现runnable接口
* 2.实例化实现类对象
* 3.创建Thread对象 将实例化对象引用传给Thread对象
* 4.调用start方法启动线程*/
class MyRunnable implements Runnable {
    @Override
    public void run() {

        String name = Thread.currentThread().getName();//"必须调用currentThread()，因为类不能直接调用实例方法"
        for (int i = 20; i < 70; i++) {
            System.out.println("name："+name+"i:"+i);
        }
    }
}
//public Thread(Runnable target) {
//    init(null, target, "Thread-" + nextThreadNum(), 0);
//}传的是这个吧




//继承 Thread 类, 直接使⽤ this 就表⽰当前线程对象的引⽤.
//• 实现 Runnable 接⼝, this 表⽰的是 MyRunnable 的引⽤. 需要使⽤
//Thread.currentThread(不是这样吗，那如果这样的话继承Thread也得用current
//你说得非常对！这是一个重要的区别！你的理解完全正确！
//✅ 你总结的完全准确：
//1. 继承Thread类时：
//class MyThread extends Thread {
//    @Override
//    public void run() {
//        // this 指向当前Thread对象
//        String name = this.getName();        // 正确：this就是线程对象
//        String name2 = getName();           // 正确：省略this
//        String name3 = Thread.currentThread().getName(); // 也正确，但多余
//    }
//}
//2. 实现Runnable接口时：
//class MyRunnable implements Runnable {
//    @Override
//    public void run() {
//        // this 指向MyRunnable对象，不是Thread对象！
//        // String name = this.getName();     // 错误！MyRunnable没有getName()
//
//        // 必须用：
//        String name = Thread.currentThread().getName(); // 正确
//    }
//}